<?php

namespace CHOMP\SGIBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use CHOMP\SGIBundle\Entity\Rol;

/**
 * @ORM\Entity(repositoryClass="CHOMP\SGIBundle\Entity\EmpresaRepository")
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="empresa")
 * @UniqueEntity(
 *		fields = "nombre",
 *		message = "Ya existe una empresa con ese nombre. Elija un nuevo nombre."
 *		)
 */
class Empresa
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=255, nullable=false)
	 * @Assert\NotBlank(
	 *       message = "La descripcion no puede estar vacía."
	 *		)
	 * @Assert\Length(
     *      min = "4",
     *      max = "255",
	 *      minMessage = "La descripción debe tener al menos {{ limit }} caracteres.",
     *      maxMessage = "La descripción debe tener {{ limit }} caracteres como máximo."
	 *		)
     */
    protected $descripcion;

    /**
     * @ORM\Column(type="string", length=30, nullable=false, unique=true)
	 * @Assert\NotBlank(
	 *       message = "El nombre no puede estar vacío."
	 *		)
	 * @Assert\Length(
     *      min = "4",
     *      max = "30",
	 *      minMessage = "El nombre debe tener al menos {{ limit }} caracteres.",
     *      maxMessage = "El nombre debe tener {{ limit }} caracteres como máximo."
	 *		)
     */
    protected $nombre;

    /**
     * @ORM\Column(type="string", length=30, nullable=true)
	 * @Assert\Length(
     *      min = "8",
     *      max = "30",
	 *      minMessage = "El teléfono debe tener al menos {{ limit }} caracteres.",
     *      maxMessage = "El teléfono debe tener {{ limit }} caracteres como máximo."
	 *		)
     */
	protected $telefono;

    /**
     * @ORM\Column(type="string", length=100, nullable=true)
     */
    protected $codigopostal;

    /**
     * @ORM\Column(type="string", length=100, nullable=true)
 	 * @Assert\Length(
     *      min = "4",
     *      max = "100",
     *      minMessage = "La calle debe tener al menos {{ limit }} caracteres.",
     *      maxMessage = "La calle debe tener {{ limit }} caracteres como máximo."
     *      )
     */
    protected $calle;

    /**
     * @ORM\Column(type="string", length=100, nullable=true)
 	 * @Assert\Length(
     *      min = "1",
     *      max = "10",
     *      minMessage = "El numero debe tener al menos {{ limit }} caracteres.",
     *      maxMessage = "El numero debe tener {{ limit }} caracteres como máximo."
     *              )
     */
    protected $numero;

    /**
     * @ORM\Column(type="string", length=100, nullable=true)
     */
    protected $piso;

    /**
     * @ORM\Column(type="string", length=100, nullable=true)
     */
    protected $dpto;

    /**
     * @ORM\Column(type="string", length=100, nullable=true)
	 * @Assert\Length(
     *      min = "4",
     *      max = "100",
	 *      minMessage = "La provincia debe tener al menos {{ limit }} caracteres.",
     *      maxMessage = "La provincia debe tener {{ limit }} caracteres como máximo."
	 *		)
     */
    protected $provincia;

    /**
     * @ORM\Column(type="string", length=100, nullable=true)
	 * @Assert\Length(
     *      min = "4",
     *      max = "100",
	 *      minMessage = "El Pais debe tener al menos {{ limit }} caracteres.",
     *      maxMessage = "El Pais debe tener {{ limit }} caracteres como máximo."
	 *		)
     */
    protected $pais;
	
    /**
     * @ORM\Column(type="boolean", nullable=false)
	 * @Assert\NotNull(message = "El campo no puede estar en blanco.")
	 * @Assert\Choice(choices = {true, false}, message = "Elija un valor.")
	 */
	protected $borrado;

	/**
	* @ORM\OneToMany(targetEntity="CuentaAnalitica", mappedBy="empresa")
	*/
	protected $cuentasAnaliticas;
	
	/**
	* @ORM\OneToMany(targetEntity="Usuario", mappedBy="empresa")
	*/
	protected $usuarios;
	
	/**
	* @ORM\OneToMany(targetEntity="Prioridad", mappedBy="empresa", cascade={"persist"})
	*/
	protected $prioridades;

    /**
    * @ORM\OneToMany(targetEntity="Rol", mappedBy="empresa", cascade={"persist"})
    */
    protected $roles;

    /**
     * @ORM\Column(type="string", length=200, nullable=true)
     */
    protected $strClave = 'minimo 8 digitos, al menos una letra mayuscula, al menos una letra minuscula, al menos un numero';

    /**
     * @ORM\Column(type="string", length=200, nullable=true)
     */
    protected $regClave;

	/**********************************
     * __construct
     *
     * 
     **********************************/	
	public function __construct()
	{
		$this->cuentasAnaliticas = new ArrayCollection();
		$this->prioridades = new ArrayCollection();
		$this->usuarios = new ArrayCollection();
		$this->roles = new ArrayCollection();
	}
	
    /**********************************
     * __toString()
     *
     * Este método sirve para poder popular los comboboxes en los forms.
     *********************************/ 
	 
	 public function __toString()
	{
		return $this->getNombre();
	}
    
	/**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set descripcion
     *
     * @param string $descripcion
     * @return Empresa
     */
    public function setDescripcion($descripcion)
    {
        $this->descripcion = $descripcion;
    
        return $this;
    }

    /**
     * Get descripcion
     *
     * @return string 
     */
    public function getDescripcion()
    {
        return $this->descripcion;
    }

    /**
     * Set nombre
     *
     * @param string $nombre
     * @return Empresa
     */
    public function setNombre($nombre)
    {
        $this->nombre = $nombre;
    
        return $this;
    }

    /**
     * Get nombre
     *
     * @return string 
     */
    public function getNombre()
    {
        return $this->nombre;
    }

    /**
     * Set telefono
     *
     * @param string $telefono
     * @return Empresa
     */
    public function setTelefono($telefono)
    {
        $this->telefono = $telefono;
    
        return $this;
    }

    /**
     * Get telefono
     *
     * @return string 
     */
    public function getTelefono()
    {
        return $this->telefono;
    }

    /**
     * Set calle
     *
     * @param string $calle
     * @return Empresa
     */
    public function setCalle($calle)
    {
        $this->calle = $calle;
    
        return $this;
    }

    /**
     * Get calle
     *
     * @return string 
     */
    public function getCalle()
    {
        return $this->calle;
    }

    /**
     * Set numero
     *
     * @param string $numero
     * @return Empresa
     */
    public function setNumero($numero)
    {
        $this->numero = $numero;
    
        return $this;
    }

    /**
     * Get numero
     *
     * @return string 
     */
    public function getNumero()
    {
        return $this->numero;
    }
	
	 /**
     * Set piso
     *
     * @param string $piso
     * @return Empresa
     */
    public function setPiso($piso)
    {
        $this->piso = $piso;
    
        return $this;
    }

    /**
     * Get piso
     *
     * @return string 
     */
    public function getPiso()
    {
        return $this->piso;
    }

	 /**
     * Set dpto
     *
     * @param string $dpto
     * @return Empresa
     */
    public function setDpto($dpto)
    {
        $this->dpto = $dpto;
    
        return $this;
    }

    /**
     * Get dpto
     *
     * @return string 
     */
    public function getDpto()
    {
        return $this->dpto;
    }

    /**
     * Set codigopostal
     *
     * @param string $codigopostal
     * @return Empresa
     */
    public function setCodigopostal($codigopostal)
    {
        $this->codigopostal = $codigopostal;
    
        return $this;
    }

    /**
     * Get codigopostal
     *
     * @return string 
     */
    public function getCodigopostal()
    {
        return $this->codigopostal;
    }
	
    /**
     * Set provincia
     *
     * @param string $provincia
     * @return Empresa
     */
    public function setProvincia($provincia)
    {
        $this->provincia = $provincia;
    
        return $this;
    }

    /**
     * Get provincia
     *
     * @return string 
     */
    public function getProvincia()
    {
        return $this->provincia;
    }

    /**
     * Set pais
     *
     * @param string $pais
     * @return Empresa
     */
    public function setPais($pais)
    {
        $this->pais = $pais;
    
        return $this;
    }

    /**
     * Get pais
     *
     * @return string 
     */
    public function getPais()
    {
        return $this->pais;
    }	

    /**
     * Add cuentasAnaliticas
     *
     * @param \CHOMP\SGIBundle\Entity\CuentaAnalitica $cuentasAnaliticas
     * @return Empresa
     */
    public function addCuentasAnalitica(\CHOMP\SGIBundle\Entity\CuentaAnalitica $cuentasAnaliticas)
    {
        $this->cuentasAnaliticas[] = $cuentasAnaliticas;
    
        return $this;
    }

    /**
     * Remove cuentasAnaliticas
     *
     * @param \CHOMP\SGIBundle\Entity\CuentaAnalitica $cuentasAnaliticas
     */
    public function removeCuentasAnalitica(\CHOMP\SGIBundle\Entity\CuentaAnalitica $cuentasAnaliticas)
    {
        $this->cuentasAnaliticas->removeElement($cuentasAnaliticas);
    }

    /**
     * Get cuentasAnaliticas
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getCuentasAnaliticas()
    {
        return $this->cuentasAnaliticas;
    }
	
    /**
     * Add prioridad
     *
     * @param \CHOMP\SGIBundle\Entity\Prioridad $prioridades
     * @return Empresa
     */
    public function addPrioridades(\CHOMP\SGIBundle\Entity\Prioridad $prioridades)
    {
        $this->prioridades[] = $prioridades;
    
        return $this;
    }

    /**
     * Remove prioridades
     *
     * @param \CHOMP\SGIBundle\Entity\Prioridad $prioridades
     */
    public function removePrioridades(\CHOMP\SGIBundle\Entity\Prioridad $prioridades)
    {
        $this->prioridades->removeElement($prioridades);
    }

    /**
     * Get prioridades
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getPrioridades()
    {
        return $this->prioridades;
    }
	
    /**
     * Add usuarios
     *
     * @param \CHOMP\SGIBundle\Entity\Usuario $usuarios
     * @return Empresa
     */
    public function addUsuario(\CHOMP\SGIBundle\Entity\Usuario $usuarios)
    {
        $this->usuarios[] = $usuarios;
    
        return $this;
    }

    /**
     * Remove usuarios
     *
     * @param \CHOMP\SGIBundle\Entity\Usuario $usuarios
     */
    public function removeUsuario(\CHOMP\SGIBundle\Entity\Usuario $usuarios)
    {
        $this->usuarios->removeElement($usuarios);
    }

    /**
     * Get usuarios
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getUsuarios()
    {
        return $this->usuarios;
    }

    /**
     * Set borrado
     *
     * @param boolean $borrado
     * @return Empresa
     */
    public function setBorrado($borrado)
    {
        $this->borrado = $borrado;
    	//acá habria que borrar todo lo relacionado con la empresa
        return $this;
    }

    /**
     * Get borrado
     *
     * @return boolean 
     */
    public function getBorrado()
    {
        return $this->borrado;
    }

    /**
     * Add roles
     *
     * @param \CHOMP\SGIBundle\Entity\Rol $rol
     * @return Empresa
     */
    public function addRol(\CHOMP\SGIBundle\Entity\Rol $rol)
    {
        $this->roles[] = $rol;
        return $this;
    }

    /**
     * Remove roles
     *
     * @param \CHOMP\SGIBundle\Entity\Rol $rol
     */
//    public function removeRol(\CHOMP\SGIBundle\Entity\Usuario $rol)
//    {
//        $this->roles->removeElement($rol);
//    }

    /**
     * Get roles
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
//    public function getRoles()
//    {
//        return $this->roles;
//    }

    /**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    /*
    public function prePersist(){
        $this -> descripcion = 'Test desde trigger prePersist';
    }
    */
    /*
preRemove - The preRemove event occurs for a given entity before the respective EntityManager remove operation for that entity is executed. It is not called for a DQL DELETE statement.
postRemove - The postRemove event occurs for an entity after the entity has been deleted. It will be invoked after the database delete operations. It is not called for a DQL DELETE statement.
prePersist - The prePersist event occurs for a given entity before the respective EntityManager persist operation for that entity is executed. It should be noted that this event is only triggered on initial persist of an entity (i.e. it does not trigger on future updates).
postPersist - The postPersist event occurs for an entity after the entity has been made persistent. It will be invoked after the database insert operations. Generated primary key values are available in the postPersist event.
preUpdate - The preUpdate event occurs before the database update operations to entity data. It is not called for a DQL UPDATE statement.
postUpdate - The postUpdate event occurs after the database update operations to entity data. It is not called for a DQL UPDATE statement.
postLoad - The postLoad event occurs for an entity after the entity has been loaded into the current EntityManager from the database or after the refresh operation has been applied to it.
const PRE_SUBMIT = 'form.pre_bind';
const SUBMIT = 'form.bind';
const POST_SUBMIT = 'form.post_bind';
const PRE_SET_DATA = 'form.pre_set_data';
const POST_SET_DATA = 'form.post_set_data';
    */

    /**
     * Set strClave
     *
     * @param string $strClave
     * @return Empresa
     */
    public function setStrClave($strClave)
    {
        $this->strClave = $strClave;
    
        return $this;
    }

    /**
     * Get strClave
     *
     * @return string 
     */
    public function getStrClave()
    {
        return $this->strClave;
    }

    /**
     * Set regClave
     *
     * @param string $regClave
     * @return Empresa
     */
    public function setRegClave($regClave)
    {
        $this->regClave = $regClave;
    
        return $this;
    }

    /**
     * Get regClave
     *
     * @return string 
     */
    public function getRegClave()
    {
        return $this->regClave;
    }

    /**
     * Add prioridades
     *
     * @param \CHOMP\SGIBundle\Entity\Prioridad $prioridades
     * @return Empresa
     */
    public function addPrioridade(\CHOMP\SGIBundle\Entity\Prioridad $prioridades)
    {
        $this->prioridades[] = $prioridades;
    
        return $this;
    }

    /**
     * Remove prioridades
     *
     * @param \CHOMP\SGIBundle\Entity\Prioridad $prioridades
     */
    public function removePrioridade(\CHOMP\SGIBundle\Entity\Prioridad $prioridades)
    {
        $this->prioridades->removeElement($prioridades);
    }

    /**
     * Add roles
     *
     * @param \CHOMP\SGIBundle\Entity\Rol $roles
     * @return Empresa
     */
    public function addRole(\CHOMP\SGIBundle\Entity\Rol $roles)
    {
        $this->roles[] = $roles;
    
        return $this;
    }

    /**
     * Remove roles
     *
     * @param \CHOMP\SGIBundle\Entity\Rol $roles
     */
    public function removeRole(\CHOMP\SGIBundle\Entity\Rol $roles)
    {
        $this->roles->removeElement($roles);
    }

    /**
     * Get roles
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getRoles()
    {
        return $this->roles;
    }


    /**
     * @ORM\PostPersist()
     */
    public function addGenericRoles(){
        //if ( ($this->getId() != '25') && ($this->getId() != '24') ){ //ahora son 1 y 2
            $this -> addRol (new Rol ('Administrador', 'Puede crear empresas, ctas analiticas, usuarios, asignar permisos y roles. Tiene acceso al modulo de seguridad y puede editar permisos. Ve todas las empresas, usuarios, etc.', $this));
            $this -> addRol (new Rol ('Coordinador', 'Tiene acceso solo a su empresa.  No puede crear usuarios. Puede crear/editar solo incidentes. Puede editar todos los campos de incidente. Debe agregar responsable externo, grupo soporte, responsable, y cuenta analitica. Tiene acceso a búsqueda por incidentes. Puede cerrar incidentes.', $this));
            $this -> addRol (new Rol ('Operador', 'Visualizacion de incidentes. Edicion de campos Operador, Resp. Soporte, Timesheet y comentarios', $this));
            $this -> addRol (new Rol ('Cliente Externo', 'Tiene acceso solo a su empresa. Visualizacion y creación de incidentes. Edicion de campos Prioridad y comentarios', $this));
        //}
    }
} 